More data structure work in xcsv
authorRobert Lipe <robertlipe@gpsbabel.org>
Mon, 30 Jul 2018 01:48:54 +0000 (20:48 -0500)
committerRobert Lipe <robertlipe@gpsbabel.org>
Mon, 30 Jul 2018 01:48:54 +0000 (20:48 -0500)
Push QStringification up two levels. Keep table and callers of
substations in Qt-land to keep QHash happy and reduce copy/leak in most
cases.

csv_util.cc
csv_util.h
xcsv.cc

index 24b31290e2cafe54b00b20e372d5d8b3bd0bce7c..457480d0a7f5ec64d6de1c1ea7c506e3641fe89c 100644 (file)
@@ -1676,9 +1676,9 @@ xcsv_waypt_pr(const Waypoint* wpt)
       buff = QString().sprintf(fmp->printfc, waypt_out_count + atoi(fmp->val));
       break;
     case XT_CONSTANT: {
-      const char* cp = xcsv_get_char_from_constant_table(fmp->val);
-      if (cp) {
-        buff = QString().sprintf(fmp->printfc, cp);
+      auto cp = xcsv_get_char_from_constant_table(fmp->val);
+      if (!cp.isEmpty()) {
+        buff = QString().sprintf(fmp->printfc, CSTR(cp));
       } else {
         buff = QString().sprintf(fmp->printfc, fmp->val);
       }
index 47de05d2d9b06136e8f26c610cf0316588b11b7e..68884b53cc1dea4cef7b722c45cd71a2881f67a3 100644 (file)
@@ -77,7 +77,7 @@ xcsv_ofield_add(const char*, const char*, const char*, int options);
 void
 xcsv_destroy_style(void);
 
-const char*
+QString
 xcsv_get_char_from_constant_table(const char* key);
 
 /****************************************************************************/
@@ -99,8 +99,8 @@ typedef struct field_map {
 
 /* something to map config file constants to chars */
 typedef struct char_map {
-  const char* key;
-  const char* chars;
+  const QString key;
+  const QString chars;
 } char_map_t;
 
 namespace gpsbabel
diff --git a/xcsv.cc b/xcsv.cc
index 75c1b44d26ee76bfa41fb0ef526bee021b9eb2d8..dde32432cf63f9cd1d62e03f2be3f4a35e6fe452 100644 (file)
--- a/xcsv.cc
+++ b/xcsv.cc
@@ -190,30 +190,29 @@ xcsv_destroy_style(void)
 }
 
 // Given a keyword of "COMMASPACE", return ", ".
-const char*
+QString
 xcsv_get_char_from_constant_table(const char* key)
 {
   static QHash<QString, QString> substitutions;
   if (substitutions.empty()) {
-    for (char_map_t* cm = xcsv_char_table; cm->key; cm++) {
+    for (char_map_t* cm = xcsv_char_table; !cm->key.isNull(); cm++) {
       substitutions.insert(cm->key, cm->chars);
     }
   }
-  if (!substitutions.contains(key)) {
-    return xstrdup(key);
+  if (substitutions.contains(key)) {
+    return substitutions[key];
   }
-  // QHash is very unhappy with raw character pointers.
-  // This is almost certainly a leak and IS certainly in bad taste, but
-  // all the callers seem to free it quickly.
-  return xstrdup(substitutions[key]);
+  // This seems like it should be bad, but we have formats depending on it!?!
+  // Warning() << "Unknown substitution keyword" << key;
+  return QString();
 }
 
 static void
 xcsv_parse_style_line(char* sbuff)
 {
   char* sp;
-  charp;
-  const char* cp;
+  char *p;
+  QString cp;
   const char* key, *val, *pfc;
 
   /*
@@ -236,7 +235,7 @@ xcsv_parse_style_line(char* sbuff)
     if (ISSTOKEN(sbuff, "FIELD_DELIMITER")) {
       sp = csv_stringtrim(&sbuff[16], "\"", 1);
       cp = xcsv_get_char_from_constant_table(sp);
-      if (cp) {
+      if (!cp.isEmpty()) {
         xcsv_file.field_delimiter = cp;
         xfree(sp);
       } else {
@@ -258,7 +257,7 @@ xcsv_parse_style_line(char* sbuff)
       if (ISSTOKEN(sbuff, "FIELD_ENCLOSER")) {
         sp = csv_stringtrim(&sbuff[15], "\"", 1);
         cp = xcsv_get_char_from_constant_table(sp);
-        if (cp) {
+        if (!cp.isEmpty()) {
           xcsv_file.field_encloser = cp;
           xfree(sp);
         } else {
@@ -273,7 +272,7 @@ xcsv_parse_style_line(char* sbuff)
         if (ISSTOKEN(sbuff, "RECORD_DELIMITER")) {
           sp = csv_stringtrim(&sbuff[17], "\"", 1);
           cp = xcsv_get_char_from_constant_table(sp);
-          if (cp) {
+          if (!cp.isEmpty()) {
             xcsv_file.record_delimiter = cp;
             xfree(sp);
           } else {
@@ -325,7 +324,7 @@ xcsv_parse_style_line(char* sbuff)
                       sp = csv_stringtrim(&sbuff[9], "\"", 1);
                       cp = xcsv_get_char_from_constant_table(sp);
 
-                      if (cp) {
+                      if (!cp.isEmpty()) {
                         p = xstrdup(cp);
                         xfree(sp);
                       } else {